草庐IT

C++17:显式转换函数 vs 显式构造函数 + 隐式转换——规则改变了吗?

Clang6、clang7和gcc7.1、7.2和7.3都同意以下是有效的C++17代码,但在C++14和C++11下是模棱两可的。MSVC2015和2017也接受它。但是,即使在c++17模式下,gcc-8.1和8.2也会拒绝它:structFoo{explicitFoo(intptr);};templatestructBar{operatorT()const;templateexplicitoperatorT2()const;};Foofoo(Barx){return(Foo)x;}接受它的编译器选择模板化显式转换函数Bar::operatorT2().拒绝它的编译器同意以下之间存

c++ - 在安全关键系统中测试 C++17

我目前正在考虑安全关键软件(DO-178CDAL-D)中的C++和编码标准的定义。我在看MISRAC++,它又有10年的历史了,它错过了所有C++11…17的特性。虽然在安全性方面保持保守通常不是一个坏主意,但新的语言功能可能对安全性有益。在审查期间,人们必须争论您做出某些决定的原因。人们总是会争辩说,新的语言特性使代码更清晰……因此关于误解的错误更少;特别是如果编译器能够测试和验证您的假设。但很难找到比“让事情更清晰”更突出安全方面的语言特征。现代C++的哪些方面真正有助于安全?我正在建立一个小型练习项目来测试这些想法,目前完全专注于“让编译器检查你的假设”。例如,我们刚刚开始使用[

c++ - 重载运算符 && 和 || 短路在 C++17 中

我阅读了http://en.cppreference.com/w/cpp/language/operators:Thebooleanlogicoperators,operator&&andoperator||Unlikethebuilt-inversions,theoverloadsdonotsequencetheirleftoperandbeforetherightone,and(untilC++17)cannotimplementshort-circuitevaluation.(我的重点)。找不到支持短路的C++17的任何资源或代码示例对于运算符&&和运算符||。它与C++17参数

c++ - 在 switch 语句中使用字符串——我们在 C++17 中的立场是什么?

我们每个人(可能)都有儿时写作的梦想:switch(my_std_string){case"foo":do_stuff();break;case"bar":do_other_stuff();break;default:just_give_up();}但这是不可能的,正如过去(2009年)对这个问题的回答中所解释的那样:Whytheswitchstatementcannotbeappliedonstrings?从那时起,我们见证了C++11的出现,它让我们走得更远:switch(my_hash::hash(my_std_string)){case"foo"_hash:do_stuff()

c++ - 在 C++17 中使用 <filesystem> 成员链接错误

我在Ubuntu16.04上使用gcc7.2,我需要使用来自C++17的新文件系统库。即使确实有一个名为experimental/filesystem的库,我也不能使用它的任何成员。例如,当我尝试编译这个文件时:#include#include#includeusingnamespacestd;namespacefs=std::experimental::filesystem::v1;intmain(){fs::pathp1="/usr/share/";}我收到如下所示的编译错误:$g++-7test.cpp-std=c++17/tmp/ccfsMnlG.o:Infunction`st

c++ - 构造函数中的完美转发 (C++17)

考虑下面的代码structA{A(intid):id_{id}{}A(constA&rhs){std::coutstructB1{constexprB1(T&&x)noexcept:x_{std::forward(x)}{}Tx_;};templatestructB2{constexprB2(T&&x)noexcept;Tx_;};templateconstexprB2::B2(T&&x)noexcept:x_{std::forward(x)}{}intmain(){Aa{1};//B1b11{a};//NotcompilingB1b12{A{2}};B2b21{a};B2b22{A{

c++ - C++14/17 中的延迟评估 - 只是 lambdas 还是 future 等?

我刚刚读到:LazyEvaluationinC++并注意到它有点旧,而且大多数答案都是关于2011年之前的C++。现在我们有语法lambdas,它甚至可以推断返回类型,所以惰性求值似乎可以归结为只是传递它们:而不是autox=foo();你执行autounevaluted_x=[](){returnfoo();};然后评估您需要的时间/地点:autox=unevaluted_x();似乎没有更多的东西。但是,answersthere之一建议使用futures与异步启动。有人可以用C++或更抽象地说明为什么/如果future对于惰性评估工作很重要吗?似乎future很可能会被急切地评估,

c++ - 为什么 C++17 标准没有带来部分类模板参数推导?

这个问题在这里已经有了答案:C++17classtemplatepartialdeduction(2个回答)关闭4年前.我希望能够使用新模板参数推导的地方之一是构造std::set's/std::maps/任何其他带有自定义比较器的容器-我的目标是创建一个单行语句,这将创建一个带有lambda比较器的有效集合。从C++11开始我能做的是:std::set>s([](inta,intb){returna>b;});但由于它使用std::function,它明显变慢了。另一种选择是:automycomp=[](inta,intb){returna>b;};std::sets(mycomp)

c++ - C++17 之前/之后的 constexpr 静态成员

据我所知,一个很常见的情况是这样的templateclassClass{public:staticconstexprintI=i;staticconstexprintJ=constexprFunction(i);//furtherClassimplementation};几乎和我一样常见的错误是(事实上,我在这里的大部分问题都是因为我忘记了它并且不知道正确的问题是什么)如果成员被odr-used忘记了附加定义:templateconstexprintClass::I;templateconstexprintClass::J;现在我读到cppreference:Definitionsan

c++ - 对于 C++17 中的非标准布局类, `offsetof` 为 "conditionally-supported"是什么意思?

C++17标准在[support.types.layout]中说:Useoftheoffsetofmacrowithatypeotherthanastandard-layoutclassisconditionally-supported.在[defns.cond.supp]:conditionally-supportedprogramconstructthatanimplementationisnotrequiredtosupport我发现offsetof的这个定义不是很精确。这是否意味着我可以安全地尝试将它与非标准布局类一起使用?“有条件支持”与定义的实现有何不同?编译器是否不支持生